var Utils = require('geoUtils');
/**
 * 节点操作器：旋转、缩放
 */
cc.Class({
    extends: cc.Component,

    properties: {
        operatorRoot: {
            default: null,
            type: cc.Node,
            tooltip: '操作器根节点，留空即为当前节点'
        },
        zeroRotationVector: {
            default: new cc.Vec2(0, -1),
            tooltip: '0旋转时的参考向量'
        },
    },

    // LIFE-CYCLE CALLBACKS:

    onLoad() {
        if (this.operatorRoot == null)
            this.operatorRoot = this.node;
        // 记录自己初始父节点
        this._oldParent = this.node.parent;
        // 初始状态不可见
        this.close();
    },
    /**
     * 设置要操作节点，会启动或关闭操作器
     * @param {cc.Node} target 要操作的节点。传入空则会关闭操作器。
     */
    _setTarget(target) {
        this._target = target;
        if (this._target != null && this._target.isValid == true) {
            // 对于有效节点，开启操作器
            this.operatorRoot.active = true;
            this._alignToTarget();
        } else {
            // 对于无效节点，则关闭操作器
            this._target = null;
            this.node.parent = this._oldParent;
            this.operatorRoot.active = false;
        }
    },
    /**
     * 给定操作目标，启动操作器
     * @param {*} target 
     */
    open(target){
        this._setTarget(target);
    },
    /**
     * 关闭操作器
     */
    close(){
        this._setTarget(null);
    },

    /**
     * 用于旋转操作器拖拽回调，实现对旋转的操作。
     * @param {*} e 
     * @param {*} item 
     * @param {*} location 
     */
    onRotaterOperation(e, item, location) {
        cc.log();
        // 计算操作器根节点位置向量到当前活动点的向量
        var curVector = new cc.Vec2(location.x, location.y);
        curVector.subSelf(Utils.node.getWorldPosition(this.operatorRoot));
        // 计算0旋转向量到当前向量的夹角
        var angle = this.zeroRotationVector.signAngle(curVector);
        // 转换弧度到角度
        angle = cc.misc.radiansToDegrees(angle);
        // TODO 为什么是-angle
        angle = -angle;
        // 角度赋值给根节点
        Utils.node.setWorldRotation(this.operatorRoot, angle);
        // 角度赋值给目标
        if (this._target != null)
            Utils.node.setWorldRotation(this._target, angle);
    },
    _alignToTarget() {
        var target = this._target;
        var root = this.operatorRoot;
        // 将操作器放入目标同一父节点下
        root.parent = target.parent;
        // 同步操作器的尺寸与目标尺寸
        root.setContentSize(target.getContentSize());
        // 同步锚点
        root.setAnchorPoint(target.getAnchorPoint());
        // 同步位置
        root.position = target.position;
        // 同步缩放
        root.scale = target.scale;
        // 同步旋转
        root.rotation = target.rotation;
    },
    update(dt) {
        // 同步位置
        if (this._target != null) {
            // 若目标已经失效则置空
            if (this._target.isValid)
                this.operatorRoot.position = this._target.position;
            else
                this.close();
        }
    },
});
